%desde(+A, -B).
desde(D, D).
desde(D, X) :- DD is D+1, desde(DD, X).

%listaDeLongNConMax(+Max, +Long, -L)
listaDeLongNConMax(_, 0, []).
listaDeLongNConMax(Max, N, [X|XS]) :- N > 0, between(0, Max, X), Nm1 is N-1, listaDeLongNConMax(Max, Nm1, XS).

%listaQueSumaN(+N, ?L)
%listaQueSumaN(0, []).
%listaQueSumaN(N, [X|XS]) :- between(1, N, X), NmX is N - X, listaQueSumaN(NmX, XS).

%listaDeLongNQueSumaM(+N, +M, ?L)
listaDeLongNQueSumaM(N, M, L) :- listaDeLongNConMax(M, N, L), sumlist(L, M).

%nListasDeLongMQueSumanO(N, M, O, LL)
nListasDeLongMQueSumanO(0, _, _, []).
nListasDeLongMQueSumanO(N, M, O, [X|XS]) :- N > 0, Nm1 is N - 1, nListasDeLongMQueSumanO(Nm1, M, O, XS), listaDeLongNQueSumaM(M, O, X).

%cuadradoSemiLatino(+N, -XS)
cuadradoSemiLatino(N, XS) :- desde(0, Sum), nListasDeLongMQueSumanO(N, N, Sum, XS).